package tec;

import java.util.Iterator;
import java.util.ArrayList;
class Greffon implements Transport, Bus{
    
    private Autobus bus;
    private Collecte collecte;
    private ArrayList<Passager> grefPassagers;
    int arret;
    Greffon(int nbPlacesAssises, int nbPlacesDebout, Collecte collecte){

	bus = new Autobus(nbPlacesAssises, nbPlacesDebout);
	grefPassagers = new ArrayList(nbPlacesAssises + nbPlacesDebout);
	this.collecte = collecte;
	arret = 0;
    }
    public boolean aPlaceAssise(){
	return bus.aPlaceAssise();
    }
    public boolean aPlaceDebout(){
	return bus.aPlaceDebout();
    }
    
    public void demanderPlaceAssise(Passager p){
	if(!p.estDehors())
	    throw new IllegalStateException("Passenger Already in Bus");
	else{
	    bus.demanderPlaceAssise(p);
	    if(p.estAssis()){
		grefPassagers.add(p);
		collecte.uneEntree();
	    }
	}
	
    }
    public void demanderPlaceDebout(Passager p){
	if(!p.estDehors())
	    throw new IllegalStateException("Passenger Already in Bus");
	else{
	    bus.demanderPlaceDebout(p);
	    if(p.estDebout()){
		grefPassagers.add(p);
		collecte.uneEntree();
	    }
	}
	
    }
    public void demanderSortie(Passager p){
	
	if(p.estDehors())
	    grefPassagers.remove(p);
	    collecte.uneSortie();
    }
    void nouvelleSortie(Iterator<Passager> place, Passager p){
	place.remove();
    }
    
    public void demanderChangerEnDebout(Passager p){
	bus.demanderChangerEnDebout(p);
    }
    public void demanderChangerEnAssis(Passager p){
	bus.demanderChangerEnAssis(p);
    }
    
    
    public void allerArretSuivant() throws TecInvalidException{
	final Iterator<Passager> passagerIte = grefPassagers.iterator();
	bus.allerArretSuivant();
	arret++;
	Bus b =  new Bus(){
	    public  void demanderSortie(Passager p) {
		Greffon.this.nouvelleSortie(passagerIte, p);
		Greffon.this.demanderSortie(p);
		
		
	    }
		public void demanderPlaceAssise(Passager p){
		    throw new IllegalStateException("Passenger Already in Bus");
		}
			
		public void demanderPlaceDebout(Passager p){
		    throw new IllegalStateException("Passenger Already in Bus");
		    
		}
		public boolean aPlaceAssise(){
			    return bus.aPlaceAssise();
			    
		}
		public boolean aPlaceDebout(){
		    return bus.aPlaceDebout();
		}
		public void demanderChangerEnDebout(Passager p){
		    bus.demanderChangerEnDebout(p);
		}
		public void demanderChangerEnAssis(Passager p){
		    bus.demanderChangerEnAssis(p);
		}
		public void allerArretSuivant() throws TecInvalidException{
		    bus.allerArretSuivant();
		}
	    
	    };
	
	while(passagerIte.hasNext()){
	    
	    try{
		passagerIte.next().nouvelArret(b, arret);
		
	    }
	    catch(IllegalStateException e){
		throw new TecInvalidException(e);
	    }
	}
	
	collecte.changerArret();
	
    }
    @Override
	public String toString() {
	
	return bus.toString();
    }
}